/**
 * @param {number[]} nums
 * @return {number}
 */
 var rob = function(nums) {
  // 考虑两种情况 一种是截取前n-1个元素 一种是截取后n-1个元素
  let len = nums.length
  if(len === 0) return 0 // 如果这个数组是空的就返回0
  if(len === 1) return nums[0] // 如果这个数组就一个元素 就返回这个元素的值
  let before = robRange(nums,0,len-2) // 截取前len-1个元素
  let after = robRange(nums,1,len-1) // 截取后len-1个元素
  return Math.max(before,after)
};
const robRange = function(nums,start,end){
  if(start === end) return nums[start] // 如果只有一个元素 就返回这个元素
  let dp = new Array(nums.length).fill(0) // 生成一个nums.length长度的数组 并初始化其为0
  dp[start] = nums[start] // 这个dp数组的start位置就是nums[start]的值
  dp[start+1] = Math.max(nums[start+1],nums[start]) // 第二个位置是第一个和下一个的值的较大值
  for(let i = start+2;i <= end;i++){ // 从start+2开始遍历 到end结束左闭右闭区间
    dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]) // 计算方法和之前一样
  }
  return dp[end] // 返回结束的位置的值
}